﻿// Spun AJAX Framework
// Copyright (C) 2008 Blake Hegerle
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Formality.FormalSystem.Parser;

namespace Formality.FormalSystem
{
    public class Negation : PrefixOperator
    {
        public Negation(Proposition Operands)
            : base(SentenceParser.NOT, Operands)
        { }
    }

    public abstract class ConstructedInfix : InfixOperator
    {
        protected ConstructedInfix(string Operator, IEnumerable<Proposition> Operands)
            : base(Operator, GetPrecedence(Operator), Operands)
        { }

        private static int GetPrecedence(string Operator)
        {
            return SentenceParser.Instance.PrecedenceRules[Operator].Precedence;
        }
    }

    public class Implication : ConstructedInfix
    {
        public Implication(params Proposition[] Operands)
            : base(SentenceParser.IMPLIES, Operands)
        { }
    }

    public class Conjunction : ConstructedInfix
    {
        public Conjunction(params Proposition[] Operands)
            : base(SentenceParser.AND, Operands)
        { }
    }

    public class Disjunction : ConstructedInfix
    {
        public Disjunction(params Proposition[] Operands)
            : base(SentenceParser.OR, Operands)
        { }
    }

    public class Equivalence : ConstructedInfix
    {
        public Equivalence(params Proposition[] Operands)
            : base(SentenceParser.EQ, Operands)
        { }
    }
}
